package v1

import (
	"github.com/gogf/gf/v2/frame/g"
	"goAdminV1/utility"
)

// UserReq 用户列表查询请求结构体
type UserReq struct {
	g.Meta       `path:"/users" method:"get" tags:"用户管理" summary:"User List"`
	Username     string `json:"username" form:"username"`                  // 用户名
	Email        string `json:"email" form:"email"`                        // 邮箱
	Status       int    `json:"status" form:"status"`                      // 状态
	DepartmentId int    `json:"department_id" form:"department_id"`        // 部门Id
	Limit        int    `json:"limit" form:"limit" v:"required#每页数量为必传参数"` // 每页数量
	Page         int    `json:"page" form:"page" v:"required#页码为必传参数"`     // 页码
}

// UserRes 用户信息结构体
type UserRes struct {
	utility.PaginatedResponse
}

type UserInfo struct {
	Id           int    `json:"id"`            // 用户Id
	Username     string `json:"username"`      // 用户名
	Email        string `json:"email"`         // 邮箱
	Avatar       string `json:"avatar"`        // 用户头像
	DepartmentId int    `json:"department_id"` // 部门Id
	CreatorId    int    `json:"creator_id"`    // 创建人Id
	Creator      string `json:"creator"`       // 创建人名称
	Jobs         []int  `json:"jobs"`          // 用户拥有岗位Id集合
	Roles        []int  `json:"roles"`         // 用户拥有角色Id集合
	Status       int    `json:"status"`        // 状态 1 正常 2 禁用
	CreatedAt    int64  `json:"created_at"`    // 创建时间
}

// UserDetailReq 用户详情查询请求结构体
type UserDetailReq struct {
	g.Meta `path:"/users/:id" method:"get" tags:"用户管理" summary:"User Detail"`
	ID     int `json:"id" uri:"id" v:"required#用户ID为必传参数"` // 用户ID，通过URI路径参数传递
}

// UserDetailRes 用户详情查询请求结构体
type UserDetailRes struct {
	ID            int      `json:"id"`
	Username      string   `json:"username"`
	Email         string   `json:"email"`
	Avatar        string   `json:"avatar"`
	RememberToken *string  `json:"remember_token"` //
	DepartmentId  int      `json:"department_id"`
	CreatorId     int      `json:"creator_id"`
	Status        int      `json:"status"`
	LoginIp       string   `json:"login_ip"`
	LoginAt       int64    `json:"login_at"`
	CreatedAt     string   `json:"created_at"`
	UpdatedAt     string   `json:"updated_at"`
	Roles         []string `json:"roles"` //
	Jobs          []string `json:"jobs"`  //
}

// UserCreateReq 用户创建请求结构体
type UserCreateReq struct {
	g.Meta       `path:"/users" method:"post" tags:"用户管理" summary:"Create User"`
	Username     string `json:"username" v:"required#用户名不能为空"`           // 用户名
	Email        string `json:"email" v:"required|email#邮箱不能为空|邮箱格式不正确"` // 邮箱
	Password     string `json:"password" v:"required#密码不能为空"`            // 密码
	Roles        []int  `json:"roles" v:"required#角色Id不能为空"`             // 角色Id集合
	DepartmentId int    `json:"department_id,omitempty"`                 // 部门Id（可选）
	Jobs         []int  `json:"jobs,omitempty"`                          // 岗位Id集合（可选）
}

// UserCreateRes 用户创建响应结构体
type UserCreateRes struct {
	UserId  int    `json:"user_id"` // 新增用户Id
	Message string `json:"message"`
}

// UserUpdateReq 用户更新请求结构体
type UserUpdateReq struct {
	g.Meta       `path:"/users/{id}" method:"put" tags:"用户管理" summary:"Update User"`
	Id           int    `json:"id" v:"required#用户Id不能为空"`                // 用户Id
	Username     string `json:"username" v:"required#用户名不能为空"`           // 用户名
	Email        string `json:"email" v:"required|email#邮箱不能为空|邮箱格式不正确"` // 邮箱
	Password     string `json:"password,omitempty"`                      // 密码（如果为空，则不更新）
	Roles        []int  `json:"roles" v:"required#角色Id不能为空"`             // 角色Id集合
	DepartmentId int    `json:"department_id,omitempty"`                 // 部门Id（可选）
	Jobs         []int  `json:"jobs,omitempty"`                          // 岗位Id集合（可选）
}

// UserUpdateRes 用户修改响应结构体
type UserUpdateRes struct {
	UserId  int    `json:"user_id"` // 新增用户Id
	Message string `json:"message"`
}

// DeleteUserReq 定义删除用户的请求结构体
type DeleteUserReq struct {
	g.Meta `path:"/users/{id}" method:"delete" tags:"用户管理" summary:"删除指定用户"`
	Id     string `json:"id" path:"id" v:"required#用户 Id 不能为空"`
}

// DeleteUserRes 定义删除用户的响应结构体
type DeleteUserRes struct {
}

// UserOnlineReq 定义用户在线接口的请求结构体
type UserOnlineReq struct {
	g.Meta   `path:"/user/online" method:"post,get" tags:"用户管理" summary:"更新用户在线信息"`
	Username string `json:"username" v:"required-if:method,post#POST请求时用户名不能为空"`
	Email    string `json:"email" v:"required-if:method,post|email#POST请求时邮箱不能为空|邮箱格式不正确"`
	Password string `json:"password"`
	Avatar   string `json:"avatar"`
}

type HiddenStatus bool

const (
	HiddenStatusShow HiddenStatus = false // 1 -> false (显示)
	HiddenStatusHide HiddenStatus = true  // 2 -> true (隐藏)
)

// Permission 权限结构体
type Permission struct {
	ID             int          `json:"id"`
	ParentID       int          `json:"parent_id"`
	PermissionName string       `json:"permission_name"`
	Route          string       `json:"route"`
	Icon           string       `json:"icon"`
	Module         string       `json:"module"`
	PermissionMark string       `json:"permission_mark"`
	Component      string       `json:"component"`
	Redirect       *string      `json:"redirect"`
	Keepalive      int          `json:"keepalive"`
	IsInner        bool         `json:"is_inner"`
	Sort           int          `json:"sort"`
	Type           int          `json:"type"`
	ActiveMenu     string       `json:"active_menu"`
	Hidden         HiddenStatus `json:"hidden"`
	CreatorID      int          `json:"creator_id"`
	CreatedAt      string       `json:"created_at"`
	UpdatedAt      string       `json:"updated_at"`
}

// UserOnlineRes 定义用户在线接口的响应结构体
type UserOnlineRes struct {
	UserData
}

// UserData 用户数据结构体
type UserData struct {
	ID            int           `json:"id"`
	Username      string        `json:"username"`
	Password      string        `json:"password"`
	Email         string        `json:"email"`
	Avatar        string        `json:"avatar"`
	RememberToken interface{}   `json:"remember_token"`
	DepartmentID  int           `json:"department_id"`
	CreatorID     int           `json:"creator_id"`
	Status        int           `json:"status"`
	LoginIP       string        `json:"login_ip"`
	LoginAt       int           `json:"login_at"`
	CreatedAt     string        `json:"created_at"`
	UpdatedAt     string        `json:"updated_at"`
	Permissions   []Permission  `json:"permissions"`
	Roles         []interface{} `json:"roles"`
	Jobs          []interface{} `json:"jobs"`
}

// UserOperateLogReq 定义用户操作日志接口的请求结构体
type UserOperateLogReq struct {
	g.Meta `path:"/user/operate/log" method:"get" tags:"用户操作日志" summary:"获取用户操作日志列表"`
	Limit  int    `json:"limit" form:"limit" d:"10" v:"min:10#每页数量不能小于1"`
	Page   int    `json:"page" form:"page" d:"1" v:"min:1#页码为必传参数且不能小于1"`
	Scope  string `json:"scope" form:"scope" v:"required|in:self,all#范围数据为必传参数且只能是 self 或 all"`
}

// UserOperateLogRes 定义用户操作日志接口的响应结构体
type UserOperateLogRes struct {
	utility.PaginatedResponse
}

// UserOperateLog 定义单个操作日志的结构体
type UserOperateLog struct {
	Id         int    `json:"id"`
	Action     string `json:"action"`
	HTTPCode   int    `json:"http_code"`
	HTTPMethod string `json:"http_method"`
	IP         string `json:"ip"`
	Module     string `json:"module"`
	Params     string `json:"params"`
	StartAt    string `json:"start_at"`
	TimeTaken  int    `json:"time_taken"`
	CreatorId  int    `json:"creator_id"`
	Creator    string `json:"creator"`
}

// UserLoginLogReq 定义用户登录日志接口的请求结构体
type UserLoginLogReq struct {
	g.Meta `path:"/user/login/log" method:"get" tags:"用户登录日志" summary:"获取用户登录日志列表"`
	Limit  int `json:"limit" form:"limit" d:"10" v:"min:10#每页数量不能小于1"`
	Page   int `json:"page" form:"page" d:"1" v:"min:1#页码为必传参数且不能小于1"`
}

// UserLoginLogRes 定义用户登录日志接口的响应结构体
type UserLoginLogRes struct {
	utility.PaginatedResponse
}

// UserLoginLog 定义单个登录日志的结构体
type UserLoginLog struct {
	Id       int    `json:"id"`
	Account  string `json:"account"`
	Location string `json:"location"`
	LoginAt  string `json:"login_at"`
	LoginIP  string `json:"login_ip"`
	Platform string `json:"platform"`
	Status   int    `json:"status"`
}
